package hsb.ruoyi.system.service.impl;//package hsb.learn.system.service.impl;
//
//import com.alibaba.fastjson2.JSON;
//import com.alibaba.fastjson2.JSONObject;
//import hsb.learn.common.constant.Constants;
//import hsb.learn.common.core.domain.AjaxResult;
//import hsb.learn.common.core.domain.TokenService;
//
//import hsb.learn.common.core.domain.entity.AppUser;
//import hsb.learn.common.core.domain.model.LoginUser;
//
//import hsb.learn.common.exception.ServiceException;
//import hsb.learn.common.exception.user.UserPasswordNotMatchException;
//import hsb.learn.common.utils.DateUtils;
//import hsb.learn.common.utils.SecurityUtils;
//import hsb.learn.common.utils.StringUtils;
//import hsb.learn.system.mapper.AppUserMapper;
//import hsb.learn.system.service.IAppUserService;
//import javax.inject.Inject;
//import org.springframework.http.HttpEntity;
//import org.springframework.http.ResponseEntity;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.authentication.BadCredentialsException;
//import org.springframework.security.core.Authentication;
//import javax.inject.Singleton;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.LinkedMultiValueMap;
//import org.springframework.util.MultiValueMap;
//import org.springframework.web.client.RestTemplate;
//import org.springframework.web.util.UriComponentsBuilder;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * app用户Service业务层处理
// *
// * @author ruoyi
// * @date 2022-08-22
// */
//@Service
//public class AppUserServiceImpl implements IAppUserService {
//
//    public static final String CODE_TO_SESSION = "https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code";
//    public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}";
//    //
//    public static final String POST_PHONE_NUMBER = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={ACCESS_TOKEN}";
//    public static final String appid = "wx84057e60b64f8bb6";
//    public static final String secret = "66d6433b9b48ee0b1176e78e9ac48a05";
//    @Inject
//    RestTemplate restTemplate;
//    @Inject
//    private AppUserMapper appUserMapper;
//    @Inject
//    private AuthenticationManager authenticationManager;
//    @Inject
//    private TokenService tokenService;
//    @Inject
//    private LocalCache redisCache;
//    private volatile long expiresTime = 0;
//    private volatile String accessToken = null;
//
//    /**
//     * 查询app用户
//     *
//     * @param id app用户主键
//     * @return app用户
//     */
//    @Override
//    public AppUser selectAppUserById(Long id) {
//        AppUser appUser = appUserMapper.selectAppUserById(id);
//        appUser.setOpenid(null);
//        appUser.setRole(null);
//        appUser.setSessionKey(null);
//        return appUser;
//    }
//
//    @Override
//    public AppUser selectByPhone(String phone) {
//        return appUserMapper.selectByPhone(phone);
//    }
//
//    /**
//     * 查询app用户列表
//     *
//     * @param appUser app用户
//     * @return app用户
//     */
//    @Override
//    public List<AppUser> selectAppUserList(AppUser appUser) {
//        return appUserMapper.selectAppUserList(appUser);
//    }
//
//    /**
//     * 新增app用户
//     *
//     * @param appUser app用户
//     * @return 结果
//     */
//    @Transactional
//    @Override
//    public int insertAppUser(AppUser appUser) {
//        //        insertCar(appUser);
//        return appUserMapper.insertAppUser(appUser);
//    }
//
//    /**
//     * 修改app用户
//     *
//     * @param appUser app用户
//     * @return 结果
//     */
//    @Transactional
//    @Override
//    public int updateAppUser(AppUser appUser) {
//        return appUserMapper.updateAppUser(appUser);
//    }
//
//    @Override
//    @Transactional
//    public int disable(AppUser appUser) {
//        Long disabled = appUser.getDisabled();
//        appUserMapper.updateAppUser(appUser);
//        if (disabled.equals(1L)) {
//            tokenService.kicOut("app_" + appUser.getId());
//        }
//        return 1;
//    }
//
//    /**
//     * 批量删除app用户
//     *
//     * @param ids 需要删除的app用户主键
//     * @return 结果
//     */
//    @Transactional
//    @Override
//    public int deleteAppUserByIds(Long[] ids) {
//        return appUserMapper.deleteAppUserByIds(ids);
//    }
//
//    /**
//     * 删除app用户信息
//     *
//     * @param id app用户主键
//     * @return 结果
//     */
//    @Transactional
//    @Override
//    public int deleteAppUserById(Long id) {
//        return appUserMapper.deleteAppUserById(id);
//    }
//
//    @Override
//    public String login(String username, String password, String code, String uuid) {
//        return null;
//    }
//
//    public String getPhoneNumber(String code) {
//        // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html
//
//        String tempAccessToken = getAccessToken(false);
//        String phone = null;
//        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
//        params.add("access_token", tempAccessToken);
//
//        Map<String, String> jsonBody = new HashMap<>();
//        jsonBody.put("code", code);
//        String jsonData = JSON.toJSONString(jsonBody);
//
//        HttpEntity<String> request = new HttpEntity<>(jsonData);
//        UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(POST_PHONE_NUMBER).queryParams(params);
//        ResponseEntity<JSONObject> response = restTemplate.postForEntity(urlBuilder.toUriString(), request, JSONObject.class);
//
//        JSONObject body = response.getBody();
//        Object errcode = body.get("errcode");
//        if (errcode == null || errcode.equals(0)) {
//            JSONObject phoneInfo = body.getJSONObject("phone_info");
//            phone = phoneInfo.getString("purePhoneNumber");
//        }
//        return phone;
//    }
//
//
//    /**
//     * @param forceUpdate 强制更新accesstoken
//     */
//    public synchronized String getAccessToken(boolean forceUpdate) {
//        //判断access_token和expires_in是否在有效期内
//        long curTime = System.currentTimeMillis();
//
//        if (!forceUpdate && curTime < expiresTime) {
//            //access_token还在有效期内，直接返回
//            return accessToken;
//        }
//
//
//        Map<String, String> params = new HashMap<>();
//        params.put("appid", appid);
//        params.put("secret", secret);
//        ResponseEntity<JSONObject> response = restTemplate.getForEntity(GET_ACCESS_TOKEN_URL, JSONObject.class, params);
//
//        JSONObject body = response.getBody();
//
//        Object errcode = body.get("errcode");
//        if (errcode == null || errcode.equals(0)) {
//            accessToken = body.getString("access_token");
//            Long expires_in = body.getLong("expires_in");  //秒
//            expiresTime = curTime + expires_in.longValue() * 1000; //获取毫秒
//            return accessToken;
//        }
//        return null;
//    }
//
//
//    /**
//     * 小程序登陆
//     */
//    @Override
//    public AjaxResult wxLogin(String phoneCode, String nickName, String code, String avator) {
//        //restTemplate
//
//        String openid = null;
//        String sessionKey = null;
//
//
//        Map<String, String> params = new HashMap<>();
//        params.put("appid", appid);
//        params.put("secret", secret);
//        params.put("code", code);
//
//        ResponseEntity<JSONObject> response = restTemplate.getForEntity(CODE_TO_SESSION, JSONObject.class, params);
//
//        JSONObject body = response.getBody();
//
//        /*
//          {
//            "openid": "用户唯一标识",
//            "session_key": "会话密钥",
//            "unionid": "用户在开放平台的唯一标识符，若当前小程序已绑定到微信开放平台帐号下会返回，详见 UnionID 机制说明。",
//            "errcode": "错误码",
//            "errmsg": "错误信息"
//          }
//          */
//
//        //返回的session_key主要用于数据校验，这个系统里不需要所有暂时不做处理
//
//        Object errcode = body.get("errcode");
//        //errcode为空也代表获取成功了  傻逼腾讯
//        if (errcode == null || errcode.equals(0)) {
//            openid = body.getString("openid");
//            sessionKey = body.getString("session_key");
//
//        } else {
//            //登录失败，把微信错误信息返回
//            return AjaxResult.error(body.getString("errmsg"));
//        }
//
//
//        if (openid != null) {
//            return wxLogin2(openid, nickName, sessionKey, avator);
//        }
//
//        return AjaxResult.error("");
//    }
//
//    private AjaxResult wxLogin2(String openid, String nickName, String sessionKey, String avator) {
//        //判断数据库中是否有该用户
//        AppUser appUser = appUserMapper.selectByopenid(openid);
//
//        //如果账号被禁用
//        if (appUser != null && appUser.getDisabled().equals(1L)) {
//            return AjaxResult.error("该账号已被禁用");
//        }
//
//        if (appUser == null) {
//            //创建新用户
//            appUser = new AppUser();
//            if (StringUtils.isBlank(nickName)) {
//                nickName = "用户_" + openid;
//            }
//            appUser.setNickName(nickName);
//            appUser.setOpenid(openid);
//            appUser.setRegisterTime(DateUtils.getNowDate());
//            appUser.setDisabled(0L);
//            appUser.setSessionKey(sessionKey);
//            appUser.setRole("appuser");
//            appUser.setAvatar(avator);
//            appUserMapper.insertAppUser(appUser);
//        } else {
//            if (StringUtils.isNoneBlank(nickName)) {
//                appUser.setNickName(nickName);
//            }
//            if (StringUtils.isNoneBlank(avator)) {
//                appUser.setAvatar(avator);
//            }
//            appUser.setSessionKey(sessionKey);
//            appUserMapper.updateAppUser(appUser);
//        }
//
//
//        //判断是否重复登陆，保存用户登录状态
//        tokenService.kicOut("app_" + appUser.getId());
//
//
//        WXAuthenticationToken wxAuthenticationToken = new WXAuthenticationToken(openid);
//        Authentication authenticate = authenticationManager.authenticate(wxAuthenticationToken);
//        //返回ruoyi系统的token作为登录凭证
//        LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
//
//        Map<String, Object> map = new HashMap<String, Object>();
//        map.put("openid", openid);
//        map.put(Constants.TOKEN, tokenService.createToken(loginUser));
//        if (StringUtils.isBlank(appUser.getPhone())) {
//            map.put("needPhone", true);
//        } else {
//            map.put("needPhone", false);
//        }
//        return AjaxResult.success(map);
//
//    }
//
//    @Override
//    public AjaxResult weixinLoginTest(String openid) {
//        return wxLogin2(openid, null, null, null);
//    }
//
//    @Override
//    public AjaxResult wxPhone(Long userId, String phoneCode) {
//        String phoneNumber = getPhoneNumber(phoneCode);
//        if (phoneNumber == null) {
//            return AjaxResult.error("获取手机号失败");
//        }
//        AppUser updateParam = new AppUser();
//        updateParam.setId(userId);
//        updateParam.setPhone(phoneNumber);
//        appUserMapper.updateAppUser(updateParam);
//        Map<String, Object> map = new HashMap<String, Object>();
//        map.put("phone", phoneNumber);
//        return AjaxResult.success(map);
//    }
//
//    @Override
//    public AjaxResult pwdLogin(String phone, String password) {
//        AppUser appUser = appUserMapper.selectByPhone(phone);
//        if (appUser != null) {
//            //判断是否重复登陆
//
//            Authentication authentication = null;
//            try {
//                // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
//                authentication = authenticationManager
//                        .authenticate(new UserPwdAuthenticationToken(phone, password));
//            } catch (Exception e) {
//                if (e instanceof BadCredentialsException) {
//                    throw new UserPasswordNotMatchException();
//                } else {
//                    throw new ServiceException(e.getMessage());
//                }
//            }
//            tokenService.kicOut("app_" + appUser.getId());
//
//            LoginUser loginUser = (LoginUser) authentication.getPrincipal();
//
//            Map<String, Object> map = new HashMap<String, Object>();
//
//            String token = tokenService.createToken(loginUser);
//            map.put(Constants.TOKEN, token);
//            map.put("phone", appUser.getPhone());
//            AjaxResult success = AjaxResult.success(map);
//            success.put(Constants.TOKEN, token);
//            return success;
//        }
//        return AjaxResult.error("账号或密码错误");
//    }
//
//    @Override
//    public AjaxResult updateUserPassword(Long userId, String oldPwd, String newPwd) {
//        AppUser user = appUserMapper.selectById(userId);
//        if (user == null) {
//            return AjaxResult.error("用户不存在");
//        }
//        if (StringUtils.isBlank(newPwd)) {
//            return AjaxResult.error("密码不能为空");
//        }
//
//        String userPassword = user.getPassword();
//
//        if (StringUtils.isBlank(userPassword)) {
//            //因为是验证码注册或者微信注册时，用户可能还没有密码,这时候不对oldPwd做验证
//        } else {
//            if (oldPwd == null) {
//                return AjaxResult.error("密码不能为空");
//            }
//            if (!SecurityUtils.matchesPassword(oldPwd, userPassword)) {
//                return AjaxResult.error("密码不匹配");
//            }
//        }
//        int updateResult = resetUserPwd(newPwd, userId);
//        if (updateResult > 0) {
//            return AjaxResult.success("更新成功");
//        }
//        return AjaxResult.error("更新失败");
//    }
//
//
//    public int resetUserPwd(String newPwd, Long userId) {
//        String password = SecurityUtils.encryptPassword(newPwd);
//        return appUserMapper.resetUserPwd(password, userId);
//    }
//
//
//}
